﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace SST_DA
{
    public class InformaticoDA
    {

        public static Informatico[] ListarInformatico() {
            const string query = "exec ListarInformaticos";
             DataTable resultado = BaseDatos.ExecuteQuery(query,new string[]{},new object[]{});
            if(resultado == null)
                return null;            
            int CantidadInformaticos = resultado.Rows.Count;
            List<Informatico> informaticos = new List<Informatico>();
            for(int i = 0; i < CantidadInformaticos; i++){
                int informaticoID = int.Parse(resultado.Rows[i].ItemArray[0].ToString());
                int[] circuitos = CircuitoDA.GetCircuitosDeInformatico(informaticoID);
                informaticos.Add(new Informatico(informaticoID,
                                            resultado.Rows[i].ItemArray[1].ToString(),
                                            resultado.Rows[i].ItemArray[2].ToString(),
                                            circuitos,
                                            int.Parse(resultado.Rows[i].ItemArray[3].ToString())));
                
            }
            return informaticos.ToArray();
        }//public static Informatico[] ListarInformatico() { 
       

        public static DataTable ListarCoordinadorDeTI()
        {
            const string query = "exec ListarCoordinadoresDeTI";
            DataTable resultado = BaseDatos.ExecuteQuery(query, new string[] { }, new object[] { });
            if (resultado == null)
                return null;
            return resultado;
        }//public static DataTable ListarCoordinadorDeTI() { 

        public static Informatico[] ListarInformaticosPorCircuito(int[] Circuitos) {
            List<Informatico> informaticos = new List<Informatico>();
            for (int i = 0; i < Circuitos.Length; i++) {
                const string query = "exec ListarInformaticosPorCircuito @ID";
                DataTable resultado = BaseDatos.ExecuteQuery(query, new string[] { "@ID" }, new object[] { Circuitos[i] });
                if (resultado == null)
                    return null;
                for (int h = 0; h < resultado.Rows.Count; h++)
                {
                    int informaticoID = int.Parse(resultado.Rows[h].ItemArray[0].ToString());
                    int[] circuitos = CircuitoDA.GetCircuitosDeInformatico(informaticoID);
                    informaticos.Add(new Informatico(informaticoID,
                                                resultado.Rows[h].ItemArray[1].ToString(),
                                                resultado.Rows[h].ItemArray[2].ToString(),
                                                circuitos,
                                                int.Parse(resultado.Rows[h].ItemArray[4].ToString())));
                }

            }
            return informaticos.ToArray();
        }//public static Informatico[] ListarInformaticosPorCircuito(int CircuitoID) { 

        public static bool AgregarInformatico(Informatico i) {
           
            const string query = "exec AgregarInformatico @nombreAgregar, @rolAgregar, @horario";                             
            DataTable result = BaseDatos.ExecuteQuery(
                                                        query,
                                                        new string[] {/* "@circuitoAgregar", */"@nombreAgregar", "@rolAgregar", "@Horario" },
                                                        new object[] {/* i.Circuitos, */ i.NombreInformatico, i.NombreRol, i.Horario });
            if (result == null && result.Rows.Count == 0)
                return false;          
            for (int o = 0; o < i.Circuitos.Length; o++)
                AgregarCircuitoAInformatico(int.Parse(result.Rows[0].ItemArray[0].ToString()), i.Circuitos[o]);
            if (int.Parse(result.Rows[0].ItemArray[0].ToString()) > 0)
                return true;
            return false;
        }//public static bool AgregarInformatico() { 

        private static bool AgregarCircuitoAInformatico(int InformaticoID, int CircuitoID) {
            const string query = "exec AgregarCircuitoAInformatico @Informatico, @Circuito";
            DataTable result = BaseDatos.ExecuteQuery(
                                                    query,
                                                    new string[] { "@Informatico", "@Circuito" },
                                                    new object[] { InformaticoID, CircuitoID });
            if (result == null && result.Rows.Count == 0)
                return false;
            if (int.Parse(result.Rows[0].ItemArray[0].ToString()) > 0)
                return true;
            return false;
        }

        public static bool EditarInformatico(Informatico i) {
            const string query = "exec EditarInformatico @InformaticoID, @NombreInformatico, @NombreRol, @Horario";
            DataTable EditResult = BaseDatos.ExecuteQuery(query, new string[] { "@NombreInformatico", "@InformaticoID", "@NombreRol", "@Horario" }, new object[] { i.NombreInformatico, i.InformaticoID, i.NombreRol, i.Horario });

            const string queryLimpiarCircuitos = "exec ClearCircuitosInformatico @Informatico";
            DataTable EditarLimpiarCircuitosResult = BaseDatos.ExecuteQuery(queryLimpiarCircuitos, new string[] { "@Informatico" }, new object[] { i.InformaticoID });

            const string queryEditarCircuito = "exec AgregarCircuitoAInformatico @Informatico, @Circuito";
            for (int j = 0; j < i.Circuitos.Length; j++) {
                DataTable editarCircuitoResult = BaseDatos.ExecuteQuery(queryEditarCircuito, new string[] { "@Informatico", "@Circuito" }, new object[] { i.InformaticoID, i.Circuitos[j] });
            }
            if (EditResult == null || EditResult.Rows.Count == 0 || EditarLimpiarCircuitosResult == null || EditarLimpiarCircuitosResult.Rows.Count == 0)
                return false;
            if (int.Parse(EditResult.Rows[0].ItemArray[0].ToString()) > 0 && int.Parse(EditarLimpiarCircuitosResult.Rows[0].ItemArray[0].ToString()) > 0 )
                return true;
            return false;
        }//public static bool EditarInformatico() { 

        public static bool EliminarInformatico(int id)
        {
            const string query = " DECLARE	@return_value int"
                                +" EXEC	@return_value = [dbo].[EliminarInformatico]"
                                +" @ID = @idToDelete"
                                +" SELECT	'Return Value' = @return_value";
            DataTable result = BaseDatos.ExecuteQuery(query, new string[] { "@idToDelete" }, new object[] { id });
            if(int.Parse(result.Rows[0].ItemArray[0].ToString()) > 0 ){
                return true;
            }
            return false;
        }//public static bool EliminarInformatico() {


        public static Informatico GetInformatico(string nombre)
        {
            object[] parametros = { nombre };
            string[] NombreParametros = { "@nombre" };
            const string query = "SELECT i.InformaticoID, i.NombreCompleto, r.NombreRol FROM Informatico as i INNER JOIN RolInformatico as ri ON i.InformaticoID=ri.InformaticoID INNER JOIN Rol as r ON ri.RolID=r.RolID WHERE i.NombreCompleto = @nombre AND i.FechaBorrado IS NULL";
            DataTable result = BaseDatos.ExecuteQuery(query, NombreParametros, parametros);
            if (result == null || result.Rows.Count == 0)
                return null;           
            int informaticoID = int.Parse(result.Rows[0].ItemArray[0].ToString());
            return new Informatico(informaticoID,
                                    result.Rows[0].ItemArray[1].ToString(),result.Rows[0].ItemArray[2].ToString(),
                                    CircuitoDA.GetCircuitosDeInformatico(informaticoID));            
        }//public static bool GetInformatico(string nombre)



        public static Informatico GetInformatico(int id)
        {
            object[] parametros = { id };
            string[] NombreParametros = { "@id" };
            const string query = "SELECT i.InformaticoID, i.NombreCompleto, r.NombreRol FROM Informatico as i INNER JOIN RolInformatico as ri ON i.InformaticoID=ri.InformaticoID INNER JOIN Rol as r ON ri.RolID=r.RolID WHERE i.InformaticoID = @id AND i.FechaBorrado IS NULL";
            DataTable result = BaseDatos.ExecuteQuery(query, NombreParametros, parametros);
            if (result == null || result.Rows.Count == 0)
                return null;
            int informaticoID = int.Parse(result.Rows[0].ItemArray[0].ToString());
            return new Informatico(informaticoID,
                                    result.Rows[0].ItemArray[1].ToString(), result.Rows[0].ItemArray[2].ToString(),
                                    CircuitoDA.GetCircuitosDeInformatico(informaticoID));
            
        }

        public static bool IsCoordinador(int InformaticoID) {
            object[] parametros = { InformaticoID };
            string[] NombreParametros = { "@Informatico" };
            const string query = "exec EsCoordinador  @Informatico";
            DataTable result = BaseDatos.ExecuteQuery(query, NombreParametros, parametros);
            if (result == null || result.Rows.Count == 0)
                return false;
            if (int.Parse(result.Rows[0].ItemArray[0].ToString()) == 1)
                return true;
            return false;
        }//public static bool IsCoordinador(int InformaticoID) { 

        public static bool CambiarCoordinadorDeCircuito(int InformaticoID, int CircuitoID) {
             object[] parametros = { InformaticoID,CircuitoID };
            string[] NombreParametros = { "@Informatico", "@Circuito" };
            const string query = "exec NuevoCoordinadorParaCircuito @Circuito, @Informatico";
            DataTable result = BaseDatos.ExecuteQuery(query, NombreParametros, parametros);
            if (result == null || result.Rows.Count == 0)
                return false;
            if (int.Parse(result.Rows[0].ItemArray[0].ToString()) == 1)
                return true;
            return false;
        }//public static bool CambiarCoordinadorDeCircuito(int InformaticoID, int CircuitoID) { 

    }//class InformaticoDA
}//namespace SST_DA
